﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Vk.Methods.Search
{
    /// <summary>
    ///     Поиск
    /// </summary>
    public class Search
    {
        private readonly Api _api;

        public Search(Api api)
        {
            _api = api;
        }

        /// <summary>
        ///     Метод позволяет получить результаты быстрого поиска по произвольной подстроке
        /// </summary>
        /// <param name="q">Текст запроса, результаты которого нужно получить</param>
        /// <param name="limit">Ограничение на количество возвращаемых результатов</param>
        /// <param name="filters">Перечисленные через запятую типы данных, которые необходимо вернуть</param>
        /// <param name="searchGlobal">
        ///     По-умолчанию к результатам поиска добавляются результаты глобального поиска по всем
        ///     пользователям и группам, это можно отключить передав false флаг, может принимать значения true или false, по
        ///     умолчанию true
        /// </param>
        public async Task<List<SearchHint>> GetHints(string q,
                                                     int? limit = null,
                                                     HintFilters filters = null,
                                                     bool? searchGlobal = null)
        {
            if (q == null)
            {
                throw new ArgumentNullException("q");
            }

            var query = new ApiQuery("search.getHints")
                .Add("q", q)
                .Add("limit", limit)
                .Add("filters", filters.ToString())
                .Add("limit", searchGlobal);

            var result = await _api.Manager.Execute(query);

            if (_api.Manager.MethodSuccessed)
            {
                var nodes = result.SelectNodes("/*");
                if (nodes != null && nodes.Any())
                    return
                        nodes.Select(
                            x =>
                            x.String("type") == "group"
                                ? (SearchHint) new GroupSearchHint(x)
                                : (SearchHint) new UserSearchHint(x)).ToList();
            }
            return null;
        }
    }
}